package grupobbva.pe.operhc.service;

import static grupobbva.pe.operhc.util.Constant.*;
import grupobbva.pe.operhc.dao.ConfigDAO;
import grupobbva.pe.operhc.dao.LoginDAO;
import grupobbva.pe.operhc.domain.PerfilIDM;
import grupobbva.pe.operhc.domain.PerfilRol;
import grupobbva.pe.operhc.domain.SegOpcion;
import grupobbva.pe.operhc.domain.SegPerfil;
import grupobbva.pe.operhc.domain.SegUsuario;
import grupobbva.pe.operhc.util.InvokeWS;
import grupobbva.pe.operhc.util.ReadProperties;
import grupobbva.pe.operhc.util.Utilities;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;

import pe.com.grupobbva.ohc.qf3b.CtConOhcQF3BRs;

import com.ibatis.dao.client.DaoManager;

public class LoginServiceImpl implements LoginService{
	
	private static Logger logger = Logger.getLogger(LoginServiceImpl.class);

	private DaoManager daoMgr;
	private LoginDAO loginDao;	
	
	public LoginServiceImpl(){
		daoMgr = ConfigDAO.getDaoManager();
		loginDao = (LoginDAO)daoMgr.getDao(LoginDAO.class);
	}
	
	public SegUsuario getIfUserExistsInApp(String codUsuario, String codigoOfi, String codigoCargo) {
		
		SegUsuario usuario = new SegUsuario();
		Map<String, String> mapParam  = new HashMap<String, String>();
		
		mapParam.put("codUsuario"  , codUsuario);
		mapParam.put("codigoOfi"   , codigoOfi);
		mapParam.put("codigoCargo" , codigoCargo);

		List<SegUsuario> listUsu = loginDao.getIfUserExistsInAppByUsu(mapParam);
		if(listUsu == null || listUsu.isEmpty()){
			
			List<SegUsuario> listCargo = loginDao.getIfUserExistsInAppByCargo(mapParam);
			if(listCargo == null || listCargo.isEmpty()){
			
				List<SegUsuario> listOfi = loginDao.getIfUserExistsInAppByOfi(mapParam);
				if(listOfi == null || listOfi.isEmpty()){
					
					usuario.setStValid(false);
					return usuario;
				}else{
					usuario = listOfi.get(0);
					usuario.setStValid(true);
					return usuario;
				}
				
			}else{
				usuario = listCargo.get(0);
				usuario.setStValid(true);
				return usuario;
			}
			
		}else{
			usuario = listUsu.get(0);
			usuario.setStValid(true);
			return usuario;
		}
	}

	public List<SegOpcion> getListOptionsByUsuario(String codUsuario) {
		return loginDao.getListOptionsByUsuario(codUsuario);
	}
	
	public Map<String, Object> getProfileHostByUsuario(String codigoUsuario) {
		if(logger.isDebugEnabled()) logger.debug("codigoUsuario: " + codigoUsuario);
		Map<String, Object> respuesta = new HashMap<String, Object>();
		CtConOhcQF3BRs response = InvokeWS.consumirQF3B(codigoUsuario);
		SegPerfil perfil = new SegPerfil();
		if(RESPUESTA_EXITOSA.equals(response.getHeader().getCodigo())) {
			perfil.setNombres(response.getData().getNombre());
			perfil.setApellidoPaterno(response.getData().getApelli1());
			perfil.setApellidoMaterno(response.getData().getApelli2());
			perfil.setRfc(response.getData().getRfc());
			perfil.setBancoPertenencia(response.getData().getBanpert());
			perfil.setOficinaPertenencia(response.getData().getOfipert());
			perfil.setBancoOperativo(response.getData().getBanoper());
			perfil.setOficinaOperativo(response.getData().getOfioper());
			perfil.setNumeroNomina(response.getData().getMatricu());
			perfil.setPuesto(response.getData().getFuncion());
			perfil.setDepartamento(response.getData().getDeparta());
			perfil.setPerfil(response.getData().getPerfil());
			perfil.setIdioma(response.getData().getIdioma());
			perfil.setIdSesion(response.getData().getSesioid());
			perfil.setEscenario(response.getData().getEscenar());
			perfil.setCodigoAutorizacion(response.getData().getAutorcd());
			perfil.setAplicacionFacultades(Utilities.splitByPosition(response.getData().getAplfacu(), 2));
			respuesta.put("perfil", perfil);
		} else {
			ReadProperties readProperties = new ReadProperties();
			if(response.getHeader().getCodigo().equalsIgnoreCase(FALLO_COMUNICACION)) {
				respuesta.put(MESSAGES_ERR_KEY, readProperties.getProperty("etiqueta.error.host.timeout") + ": " + response.getHeader().getDescripcion());
			} else {
				respuesta.put(MESSAGES_ERR_KEY, StringUtils.substring(response.getHeader().getDescripcion(), 8));
			}
		}
		return respuesta;
	}
	
	//ini MCG20140804
	public List<PerfilIDM> getPerfilIdmBYCodUsuario(String codigoUsuario) {
		String teclaPulsada = FN_DEFAULT;
		String control = "";
		List<PerfilIDM> listPerfilIDM = new ArrayList<PerfilIDM>();
		String[] listadoPerfilIDM = new String[13];
		//MILTON DESCOMENTAR EN PRODU
		
//    	do {
//			if(StringUtils.isNotBlank(control)) {
//				teclaPulsada = FN_PAGINA_SGTE;
//			}
//			CtConOhcHY30Rs response = InvokeWS.consumirHY30(codigoUsuario, teclaPulsada, null, null, control);
//			if(response != null) {
//				control = response.getData().getControl();
//				listadoPerfilIDM = response.getData().getDetalles();
//				for (String perfilIDMInfo : listadoPerfilIDM) {
//					if(StringUtils.isNotBlank(perfilIDMInfo)) {
//						PerfilIDM perfilIDM = new PerfilIDM();
//						listPerfilIDM.add(perfilIDM.mapearPerfilIDM(perfilIDMInfo));
//					}
//				}
//			}
//		} while(StringUtils.isNotBlank(control) && StringUtils.isNotBlank(listadoPerfilIDM[0]));
		//COMENTAR MILTON PARA OBTENER EL SERIALIZADO DESCOMENTAR EN PROD
    	PerfilIDM perfilIDM1 = new PerfilIDM();
    	perfilIDM1.setCodPerfilIDM("OPERHC00011");
    	perfilIDM1.setNombrePerfilIDM("ADMINISTRADOR");
    	listPerfilIDM.add(perfilIDM1);

     	PerfilIDM perfilIDM2 = new PerfilIDM();
    	perfilIDM2.setCodPerfilIDM("OPERHC00012");
    	perfilIDM2.setNombrePerfilIDM("CONSULTOR");
    	listPerfilIDM.add(perfilIDM2);
     	
//    	PerfilIDM perfilIDM3 = new PerfilIDM();
//    	perfilIDM3.setCodPerfilIDM("OPERHC00013");
//    	perfilIDM3.setNombrePerfilIDM("CONTRATADOR");
//    	listPerfilIDM.add(perfilIDM3);
//     	
//    	PerfilIDM perfilIDM4 = new PerfilIDM();
//    	perfilIDM4.setCodPerfilIDM("OPERHC00014");
//    	perfilIDM4.setNombrePerfilIDM("REEVALUADOR");
//    	listPerfilIDM.add(perfilIDM4);
    	


		
		return listPerfilIDM;
	}
	
	
	public List<PerfilRol> getRolesByPerfilesIDM(String codigoUsuario) {
		
		List<PerfilIDM>  olistPerfilIDM=new ArrayList<PerfilIDM>();
		List<PerfilRol>  olistRoles=new ArrayList<PerfilRol>();
		olistPerfilIDM=getPerfilIdmBYCodUsuario(codigoUsuario);
		String cadenaCodPerfiles="";
		boolean primero=true;
		if (olistPerfilIDM!=null && olistPerfilIDM.size()>0){

			for (PerfilIDM operfil: olistPerfilIDM){
				String codigoperfil=operfil.getCodPerfilIDM()==null?"":operfil.getCodPerfilIDM().toString();
				if (primero){
					cadenaCodPerfiles="'"+codigoperfil+"'";
					primero=false;
				}
				cadenaCodPerfiles=cadenaCodPerfiles +","+"'"+codigoperfil+"'";
			}
			
			olistRoles=loginDao.getListRolesByPerfiles(cadenaCodPerfiles);			
		}
		return olistRoles;
	}
	
	
	//fin MCG20140804
	

}
